#ifndef EVENTDETECTION_H_
#define EVENTDETECTION_H_

// gtracker
#include "gtrack.h"
// event
#include "traffic_info.h"
#include "EventThreshold_def.h"
#include "lane_def.h"

#define DETECT_WINDOW_SIZE 5 

// 滑动窗口计算器
typedef struct 
{
	
	float buffer[DETECT_WINDOW_SIZE];			// 缓存信息
	int write_pos;												// 下一次写时候的位置
	int read_pos;												// 读取最新数据位置
	int valid_count;											// 有效数据量
	float sum;														// 当前总和
} WindowsInfo;

// 历史信息
typedef struct
{
	WindowsInfo vel_x;						// 历史x方向速度
	WindowsInfo vel_y;						// 历史y方向速度
	uint16_t retrogradeNum;			// 逆行计数
	uint16_t overSpeedingNum;		// 超速计数
	uint16_t stopNum;						// 停止计数
	uint16_t underSpeedingNum;		// 低速计数
	uint16_t changeLaneNum;			// 非法变道计数
}HistoryInfo;

// 检测状态
typedef enum 
{
	Detecting = 0 ,
	NotDetecting
}DetectState;

// 事件检测单元
typedef struct
{
	uint8_t cur_laneID;										// 当前所在车道
	uint8_t last_laneID;										// 历史所在车道
	float last_y;
	HistoryInfo historyInfo;								// 历史信息
	DetectState state;										// 检测状态
	RoadTopology* roadParam;						// 道路参数
	EventConfiguration* thresholdParam;		// 事件检测阈值参数

	
	
}
DetectionUnitInstance;

// 事件检测模块
typedef struct
{
	EventConfiguration* param;						// 事件参数配置
	RoadTopology* roadParam;						// 道路参数
	uint16_t maxNumTracks;								// 目标上限
	void** hTrack;												// 句柄
	Traffic_info result;										// 交通信息
	uint32_t timestamp;									// 时间戳/帧
}DetectionModuleInstance;

// 外部输入定义
#define EVENT_MAX_CONTROL_POINTS (9U)
#define EVENT_MAX_LANE_NUM 16

// 外部输入道路线参数定义
typedef struct
{
    uint16_t numControlPoints;														// 二阶贝塞尔曲线控制点数
    uint8_t maxNumLanes;																// 车道数
	InsertDirection direction;															// 车道线生成方向
    float width;																					// 车道宽度 m
	Point2D ControlPoints[EVENT_MAX_CONTROL_POINTS];			// 控制点
	float max_speed[EVENT_MAX_LANE_NUM];								// 设置每条车道的最高速度	km/h（暂用m/s）
	float min_speed[EVENT_MAX_LANE_NUM];								// 设置每条车道的最低速度	km/h（暂用m/s）
	float detection_line[EVENT_MAX_LANE_NUM];							// 检测截面位置（Y）
	laneDirection moveDirection[EVENT_MAX_LANE_NUM];			// 设置每个车道的行驶方向
	laneType type[EVENT_MAX_LANE_NUM];									// 各个车道线虚实设置
	DetectionZone detectZone[EVENT_MAX_LANE_NUM];				// 各个车道检测区域设置
}event_roadBaseParams; 

// 外部输入参数定义
typedef struct
{
	uint16_t major_version;							// 主版本号
	uint16_t minor_version;							// 次版本号
	float absolute_min_speed;						// 最低速度 km/h（暂用m/s）
	float traffic_jam_speed;							// 拥堵速度 km/h（暂用m/s）
	EventThreshold reversed_driving;			// 逆行事件阈值
	EventThreshold lane_change;					// 非法变道事件阈值
	EventThreshold speed;							// 速度阈值
}event_ThresholdParam; 

// 外部输入参数定义
typedef struct
{
    event_roadBaseParams laneParams;			// 道路设置参数
	event_ThresholdParam thresholdParam;	// 事件检测参数
	uint16_t maxNumTarget;							// 最大目标数量

} event_moduleConfig;

/**
*  @b Description
*  @n
*      创建一个事件检测模块的实例
*  @param[in] config
*		一个指向配置结构的指针。该结构包含 事件检测 算法暴露的所有参数。
* 
*  @retval
*      事件检测模块的句柄
*/
void* event_creatEventModuleInstace(event_moduleConfig* config);

/**
 *  @b Description
 *  @n
 *   事件检测模块的入口函数
 *       应用程序应调用该函数来处理一帧的事件检测结果。
 *  @param[in]  handle
 *     事件检测模块的句柄
 *  @param[in]  t
 *      GTRACK 跟踪目标的指针。
 *  @param[in]  tNum
 *      跟踪目标的个数
 *  @param[out]  info
 *      交通事件信息
 * 
 *  @retval
 *      None
 */
void event_Step(void* handle, GTRACK_targetDesc* t, uint16_t* tNum, Traffic_info* info);

/**
 *  @b Description
 *  @n
 *	 事件检测模块delete函数
 *      应用程序调用该函数删除 事件检测 模块实例。
 *  @param[in]  handle
 *      事件检测模块的句柄
 *
 *  @retval
 *      None
 */
void event_delete(void* handle);

#endif // 